package urjc.as.emergencies.server;

import org.apache.log4j.PropertyConfigurator;
import org.restlet.Application;
import org.restlet.Component;
import org.restlet.Restlet;
import org.restlet.Router;
import org.restlet.data.Protocol;

import urjc.as.emergencies.client.CommToolkit;
import urjc.as.emergencies.data.AmbulanceList;
import urjc.as.emergencies.data.MissionList;
import urjc.as.emergencies.data.Storage;
import urjc.as.emergencies.resources.PatientRecordResource;
import urjc.as.emergencies.resources.MissionResource;
import urjc.as.emergencies.resources.MissionsResource;
import urjc.as.emergencies.resources.PatientInfoResource;
import urjc.as.emergencies.resources.ambulance.AmbulanceResource;
import urjc.as.emergencies.resources.ambulance.AmbulancesResource;

/**
 * Esta aplicación modela el funcionamiento de un sistema de correo electrónico
 * web básico siguiendo el estilo arquitectónico REST.
 * 
 * @author Sergio Saugar
 */
public class SummaServer extends Application {

	/**
	 * Constructor de la aplicación
	 */
	public SummaServer() {

		super();
		initSystem();

		// Creamos un nuevo componente (servidor web)
		Component component = new Component();
		component.getClients().add(Protocol.HTTP);
		component.getServers().add(Protocol.HTTP, "localhost", 8080);

		this.setContext(component.getContext().createChildContext());

		// Añadimos esta aplicación al componente dentro del Host por defecto
		component.getDefaultHost().attach(this);

		// Intentamos lanzar el servidor web de esta aplicación
		try {
			component.start();
		} catch (Exception e) {
			// Si no se puede lanzar, anunciamos el error.
			System.err
					.println("ERROR!!! El servidor no ha podido ser lanzado.");
			e.printStackTrace(System.err);
			System.exit(-1);
		}
	}

	private void initSystem() {
		//Inicializa el logger
		// Init log system
		PropertyConfigurator.configure("src/urjc/as/emergencies/log4j.properties");
		
		Storage storage = Storage.getInstance();
				
		//Crea el recurso missiones
		MissionList missionList = new MissionList();
		missionList.setUri(CommToolkit.MISSIONS);
		storage.addEntity(missionList);
		
		//Crea la lista de misiones
		AmbulanceList ambulancias = new AmbulanceList();

		ambulancias.setUri("http://localhost:8080/ambulancias");
		storage.addEntity(ambulancias);
	}

	// ///////// RESTLET METHODS

	/**
	 * Devuelve el restlet raiz que recibirá todas las peticiones.
	 * 
	 * @return El router de nuestra aplicación
	 * @see org.restlet.Restlet
	 */
	@Override
	public synchronized Restlet createRoot() {

		// En nuestro caso, devolveremos un router que redirigirá las peticiones
		// a los otros restlets.
		Router router = new Router(getContext().createChildContext());

		// Define una ruta para el recurso misiones
		router.attach("/missions", MissionsResource.class);

		
		//Define una ruta para el recurso ambulancias
		router.attach("/ambulancias", AmbulancesResource.class);
		
		//Define la ruta para el recurso ambulancia
		router.attach("/ambulancias/{id}", AmbulanceResource.class);

		//Define la ruta para el recurso mision
		router.attach("/missions/{idMission}", MissionResource.class);
		router.attach("/missions/{idMission}/patientInfo", PatientInfoResource.class);
		router.attach("/missions/{idMission}/patientInfo/historial", PatientRecordResource.class);
				
		

		// // Define una ruta para el recurso mailbox
		// router.attach("/users/{userId}/mail", MailboxResource.class);
		//
		// // Define una ruta para el recurso folder
		// router.attach("/users/{userId}/mail/{folderId}",
		// FolderResource.class);
		//
		// // Define una ruta para el recurso email
		// router.attach("/users/{userId}/mail/{folderId}/{emailId}",
		// EmailResource.class);

		return router;
	}

	/**
	 * Arranca la aplicación servidor de correo
	 * 
	 * @param args
	 *            No tiene argumentos adicionales
	 */
	public static void main(String[] args) {
		new SummaServer();
	}

}
